/**
 * 数据迁移工具
 * 将旧的明文数据迁移为加密数据
 */

import { setStorageSync, getStorageSync, StorageKeys } from './storage.js';
import { encryptData } from './crypto.js';

/**
 * 检查并迁移旧数据
 * 如果发现旧数据（未加密），自动转换为加密格式
 */
export function migrateOldData() {
	try {
		// 检查账号数据
		migrateStorageKey(StorageKeys.ACCOUNTS);
		
		// 检查标签数据
		migrateStorageKey(StorageKeys.TAGS);
	} catch (error) {
		console.error('数据迁移失败:', error);
	}
}

/**
 * 迁移指定的存储键
 * @param {string} key 存储键
 */
function migrateStorageKey(key) {
	try {
		// 直接读取原始数据（不经过解密）
		const rawValue = uni.getStorageSync(key);
		
		if (rawValue === null || rawValue === undefined || rawValue === '') {
			return; // 没有数据，无需迁移
		}
		
		// 如果已经是加密数据，无需迁移
		if (typeof rawValue === 'string' && rawValue.startsWith('ENC:')) {
			return;
		}
		
		// 如果是对象或数组（旧数据直接存储），需要迁移
		let dataToEncrypt = rawValue;
		
		if (typeof rawValue !== 'string') {
			// 对象或数组直接存储，转换为 JSON 字符串再加密
			dataToEncrypt = JSON.stringify(rawValue);
		} else if (rawValue.startsWith('[') || rawValue.startsWith('{')) {
			// JSON 字符串但未加密，直接加密
			// 数据已经是 JSON 字符串格式
		} else {
			// 其他类型的数据，不需要加密
			return;
		}
		
		// 加密数据并保存
		const encrypted = encryptData(dataToEncrypt);
		uni.setStorageSync(key, encrypted);
		
		console.log(`数据迁移成功: ${key}`);
	} catch (error) {
		console.error(`迁移 ${key} 失败:`, error);
		// 迁移失败不影响应用运行
	}
}

/**
 * 初始化时执行数据迁移
 * 在应用启动时调用一次
 */
export function initDataMigration() {
	try {
		migrateOldData();
	} catch (error) {
		console.error('初始化数据迁移失败:', error);
	}
}

